Android ViewModel
ViewModelはViewのことを知らない。ViewはViewModelを監視してる。
SubjectはObserverのことを知らない。一心不乱に別の場所に通知を出す。
Observer pattern
#MVVM を最初に抑える。Model View ViewModel の Androidでの方法
The class class is designed to store and manage UI-related data in a lifecycle conscious way.
ViewModel Overview  |  Android Developers
利点
so that data they hold is immediately available to the next activity or fragment instance.
ViewModel Overview  |  Android Developers
ViewModel オブジェクトは、対象のActivityより(ちょっとだけ)長生きだし、activityのdestroyでご破産としない。
Activityがfinishすると、onCleared()を呼んで対象リソース(liveData)を消す、自分自身も消す?
Activityの再生性をいかに生き残るか?は、詳細わからずだけど、
Android Architecture Components の ViewModel って…一体何者だ? - Qiita
ViewModel の実装を読み進めていくと、この Fragment#setRetainInstance メソッドを使った Fragment が出てきます
が参考になる。
android - Understanding Fragment's setRetainInstance(boolean) - Stack Overflow
#TODO
Factory methodで、ViewModelインスタンスを作成する。
ViewModelを生成する際にModelを指定する - Focus On Programming
DI用
ViewModelのconstructorに引数を渡したい場面は、目的がDIでなくてもあるかな。
Kotlin Object Expressionsを使ってFactory Methodにして、Activity上の変数への参照を持つのもいいかと思ったけど...
これは、ViewModelの中から Actibity側を参照する形になるので、良くない(はず)
Injectするものは(も)、disposalにしないといけない?
以下、メモの残骸。
--------------------------------------------------------------
java - Android LiveData - how to reuse the same ViewModel on different activities? - Stack Overflow
ViewModelのlifecycleの絵がよく出てきて、ViewModelの objectは app全体で生き残るけど、
通常は、lifecycleOwner(あるActivity)の範囲でしか、管理しない。
you actually create/retain a ViewModelStore which is bound to this,
なので、activity間で残るようにするには、singletonにする
が、筋悪。
Android LiveDataの方をsingletonにすればよい?
Android Room with a View - Kotlin
ここに、AndroidViewmodelというclassの例があった。
Locale changes and the AndroidViewModel antipattern
ここでは、
Building an Android App using Android Architecture Components: Room, ViewModel, and LiveData
ここでは、repositoryのconsuctorのparameterに使ってる。
感想: ViewModelはActivity単位(スコープ)が自然なので、packageをActivity単位にするのが妥当なフォルダ分けかな。
関連topic:
#Android_UI #Observer_pattern
責務?
app全体で、データの保持、更新?に責任を持つ
実際の Implement, ViewModelの定義(クラス)と、それをactivityやfragmentで実体化して使う事の両面
ViewModelの継承(定義)
code: viewmodelExample.kt
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData().also {loadUsers() }
}
fun getUsers(): LiveData<List<User>> { return users }
private fun loadUsers() {
// Do an asynchronous operation to fetch users.
}
}
ViewModelを継承する MyViewModelは、
users変数を持ち、これはLiveData型(Android LiveDataは別topic)
getUsersメソッドを外部に公開する。
loadUsers()はprivateで、initializationでuser取得を実装しておく。
View(AcitibvityやFragment)側は、
ViewModelProviders.of(...から viewModelを取得して、
その liveData部分(getUsers())をobserve(this, Observer..)する
code: CallViewModel.kt
val model = ViewModelProviders.of(this)MyViewModel::class.java
model.getUsers().observe(this, Observer<List<User>>{ users ->
// update UI .
})
When the owner activity is finished, ......onCleared() method so that it can clean up resources.
で、後始末もしてくれると。
model側(データのCRUDをする)は、
viewModel側が公開してるメソッドなどを使って, viewModelのvalueを更新していく
modelへの操作の起点はユーザーの操作だとしたら、
modelの記述はactivityやfragmentに書いてしまうこともあるけど、基本はmodel用用のファイルやクラスを作る?
ViewModelのlifecycle:
ViewModelのlifecycle, Applicationが存続する期間と同じ
もしも Activity の参照を ViewModel が持ってしまったら、寿命が切れた Activity の参照を持ち続けてしまいます...
Android Architecture Components の ViewModel って…一体何者だ? - Qiitaとなる。
画面を回転(Android Layout Rotation)させても、ActivityやFragment側で、ViewModelの値を呼び出せる
https://gyazo.com/5f59f99f02676a424c23521337d325a3
Tutorial:
Android lifecycle-aware components codelab
Kotlin, LiveData, coroutine なんかを使って初めてのAndroidアプリを作る(1)準備編 - Qiita
こちらが、非常に良いと思う
参考:
Android lifecycle-aware components
but problem arises when ViewModel needs to communicate View state, progress indicator status, validation/server errors.
Android Architecture: Communication between ViewModel and View